package com.example.forum.utils;

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import lombok.extern.slf4j.Slf4j;

/**
 * 用于处理JSON反序列化为Byte类型的自定义反序列化器
 * 可以处理字符串、整数、布尔值等多种类型的输入，确保准确转换为Byte类型
 */
@Slf4j
public class ByteDeserializer extends JsonDeserializer<Byte> {

    @Override
    public Byte deserialize(JsonParser p, DeserializationContext ctxt) 
            throws IOException, JsonProcessingException {
        // 处理不同类型的输入
        JsonToken token = p.getCurrentToken();
        
        // 如果是null，直接返回0
        if (token == JsonToken.VALUE_NULL) {
            return 0;
        } 
        // 如果是布尔值，true转为1，false转为0
        else if (token == JsonToken.VALUE_TRUE) {
            return 1;
        } 
        else if (token == JsonToken.VALUE_FALSE) {
            return 0;
        } 
        // 如果是直接的数字，直接转换
        else if (token == JsonToken.VALUE_NUMBER_INT) {
            return (byte) p.getIntValue();
        } 
        // 如果是字符串，尝试解析
        else if (token == JsonToken.VALUE_STRING) {
            String text = p.getText();
            if (text == null || text.isEmpty()) {
                return 0;
            }
            
            try {
                // 尝试直接解析为数字
                return Byte.valueOf(text);
            } catch (NumberFormatException e) {
                // 特殊处理一些可能的字符串表示
                if ("true".equalsIgnoreCase(text) || "yes".equalsIgnoreCase(text) || "y".equalsIgnoreCase(text)) {
                    return 1;
                } else {
                    // 其他情况返回0
                    log.warn("解析Byte类型失败，输入值: {}, 使用默认值0", text);
                    return 0;
                }
            }
        }
        
        // 其他情况，返回默认值0
        log.warn("无法识别的JSON类型: {}, 使用默认值0", token);
        return 0;
    }
} 